//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
/**
 *
 *	@file		fld_encount_data.c
 *	@brief		フィールドエンカウントデータ
 *	@author		tomoya takahashi
 *	@data		2006.06.08
 *
 *	バトルパラメータから
 *	エンカウントエフェクト　BGMをけっていするルーチン
 *
 */
//]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

#include "common.h"

#include "fieldsys.h"

#include "encount_effect.h"
#include "ev_pokemon.h"
#include "poketool/poke_tool.h"
#include "poketool/tr_tool.h"
#include "poketool/monsno.h"

#include "battle/trtype_def.h"

#include "system/snd_tool.h"
#include "field/fld_bgm.h"
#include "field/eventflag.h"
#include "zonedata.h"

#include "sysflag.h"

#include "mapdefine.h"

#define __FIELD_ENCEFF_DATA_H_GLOBAL
#include "fld_enceff_data.h"

#define POKEGS_ENC

// 09.03.23 add by hosaka genya
// カントー上陸フラグが立ってないときにカントーBGM切替の判定を無効にする
#define ENCOUNT_BGM_CHECK_ARRIVE_T06

//-----------------------------------------------------------------------------
/**
 *					コーディング規約
 *		●関数名
 *				１文字目は大文字それ以降は小文字にする
 *		●変数名
 *				・変数共通
 *						constには c_ を付ける
 *						staticには s_ を付ける
 *						ポインタには p_ を付ける
 *						全て合わさると csp_ となる
 *				・グローバル変数
 *						１文字目は大文字
 *				・関数内変数
 *						小文字と”＿”と数字を使用する 関数の引数もこれと同じ
*/
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/**
 *					定数宣言
*/
//-----------------------------------------------------------------------------
//-------------------------------------
//	特殊エンカウントタイプ定数
//
//	通常エンカウント
//		フィールド、トレーナー以外の
//		独自のエフェクト音を使用するエフェクト
//=====================================
enum{
	// GYM
	FLD_ENCEFF_SP_GYM_KUROGANE,			// クロガネジム
	FLD_ENCEFF_SP_GYM_HAKUTAI,			// ハクタイジム
	FLD_ENCEFF_SP_GYM_NOMOSE,			// ノモセジム
	FLD_ENCEFF_SP_GYM_TOBARI,			// トバリジム
	FLD_ENCEFF_SP_GYM_YOSUGA,			// ヨスガトジム
	FLD_ENCEFF_SP_GYM_KISSAKI,			// キッサキジム
	FLD_ENCEFF_SP_GYM_MIO,				// ミオジム
	FLD_ENCEFF_SP_GYM_NAGISA,			// ナギサジム
	// GYM カントー
	FLD_ENCEFF_SP_GYM_TAKESHI,			//
	FLD_ENCEFF_SP_GYM_KASUMI,			//
	FLD_ENCEFF_SP_GYM_MATHISU,			//
	FLD_ENCEFF_SP_GYM_ERIKA,			//
	FLD_ENCEFF_SP_GYM_ANZU,				//
	FLD_ENCEFF_SP_GYM_NATSUME,			//
	FLD_ENCEFF_SP_GYM_KATSURA,			//
	FLD_ENCEFF_SP_GYM_GREEN,			//
	// 四天王
	FLD_ENCEFF_SP_BIGFOUR_00,
	FLD_ENCEFF_SP_BIGFOUR_01,
	FLD_ENCEFF_SP_BIGFOUR_02,
	FLD_ENCEFF_SP_BIGFOUR_03,
	// チャンピオン
	FLD_ENCEFF_SP_CHANPION,
	// ライバル
	FLD_ENCEFF_SP_RIVAL,
	// 特殊ポケモン
#ifdef POKEGS_ENC
	FLD_ENCEFF_SP_LEGEND_MOVE_RAIKOU,		//	移動ポケモン：ライコウ
	FLD_ENCEFF_SP_LEGEND_MOVE_ENTEI,		//	移動ポケモン：エンテイ
	FLD_ENCEFF_SP_LEGEND_MOVE_SUIKUN,		//	移動ポケモン：スイクン
	FLD_ENCEFF_SP_PACKAGE_HOUOU,			//	パッケージポケモン：ホウオウ
	FLD_ENCEFF_SP_PACKAGE_RUGIA,			//	パッケージポケモン：ルギア
	FLD_ENCEFF_SP_LEGEND_KODAI,				//	グラードン、カイオーガ、レックウザ
	FLD_ENCEFF_SP_LEGEND_NORA,				//	ミュウツー、ラティアス、ラティオス
//	FLD_ENCEFF_SP_LEGEND_SELEBHI,			//	セレビィ
//	FLD_ENCEFF_SP_LEGEND_DUMMY,				//	ダミー
#else	//	金銀ではでないポケモン
	FLD_ENCEFF_SP_LEGEND_POKE00,	// シェイミ
	FLD_ENCEFF_SP_PACKAGE_POKE00,	// イア、エア
	FLD_ENCEFF_SP_REIHAI_POKE00,	// レイ　ハイ
	FLD_ENCEFF_SP_AI_POKE00,		// アイ
	FLD_ENCEFF_SP_ARUSEUSU,			// アルセウス
	FLD_ENCEFF_SP_LEGEND_POKE01,	// ﾚｼﾞｷﾞｶﾞｽ、ヒードラン、ダーくらい
	FLD_ENCEFF_SP_LEGEND_POKE02,	// クレセリア
	FLD_ENCEFF_SP_PACKAGE_POKE01,	// ファイアー、サンダー、フリーザー
	FLD_ENCEFF_SP_LEGEND_POKE03,	// キマイラン
	FLD_ENCEFF_SP_LEGEND_POKE04,	// レジスチル、レジアイス、レジロック
#endif
	// ロケット団
	// GSで変更&追加しました。R団は順番を変えないでください。
	// 09.02.25 add by hosaka genya
	FLD_ENCEFF_SP_ROCKET_NORMAL,		// 通常メンバー
//	FLD_ENCEFF_SP_ROCKET_SPECIAL,		// 幹部クラス
//	FLD_ENCEFF_SP_ROCKET_BOSU,			// ボス
	FLD_ENCEFF_SP_ROCKET_RAMUDA,		// 準幹部：ラムダ
	FLD_ENCEFF_SP_ROCKET_LANCE,			// 準幹部：ランス
	FLD_ENCEFF_SP_ROCKET_APORO,			// 幹部：アポロ
	FLD_ENCEFF_SP_ROCKET_ATENA,			// 幹部：アテナ
	FLD_ENCEFF_SP_ROCKET_SAKAKI,		// ボス：サカキ
	// その他特殊バトル
	FLD_ENCEFF_SP_BATTLE_TOWER,		// バトルタワー
	FLD_ENCEFF_SP_BATTLE_COMMU,		// 通信バトル
	FLD_ENCEFF_SP_BATTLE_DOUBLE,		// ダブルバトルトレーナー
	FLD_ENCEFF_SP_BATTLE_DOUBLE_YASEI,	// ダブルバトルやせい
//	FLD_ENCEFF_SP_BATTLE_TOWER_TAIKUUN,	// タワータイクーン
	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN,// フロンティアブレーン
	FLD_ENCEFF_SP_BATTLE_DOUBLE_GYM,	// ダブルバトルジム

	// ノーマル
	FLD_ENCEFF_SP_NORMAL_TRAINER,	// トレーナー
	FLD_ENCEFF_SP_NORMAL_FIELD,		// 野生

	//---------------------------------------------
	// 以下、GSで追加 09.02.25 add by hosaka genya
	FLD_ENCEFF_SP_MAIKO,	// まいこはん
	FLD_ENCEFF_SP_RED,		// レッド

	FLD_ENCEFF_SP_MAX,	// 特殊エンカウント数
};


//-------------------------------------
///	パルパークゾーンID
//=====================================
#define FLD_ENCEFF_PALPARK_ZONEID	( ZONE_ID_D10R0101 )	// プラチナと金銀は同じ

//-----------------------------------------------------------------------------
/**
 *					構造体宣言
*/
//-----------------------------------------------------------------------------
//-------------------------------------
//	特殊エンカウントデータワーク
//=====================================
typedef struct {
	u16 effect_no;
	u16 bgm_no;
} FLD_ENCEFF_SP_DATA;


//-----------------------------------------------------------------------------
/**
 *		特殊エンカウントエフェクトテーブル
 *			【特殊エンカウントタイプ定数】のならびに
 *			あわせる必要があります。
 *			※ 定数はすぐ上にあります
*/
//-----------------------------------------------------------------------------
// エンカウントエフェクトをバトルパラメータからSEARCHする
#define ENCOUNT_EFFECT_SEARCH	( 0xffff )


static const FLD_ENCEFF_SP_DATA FLD_EncEffSpData[ FLD_ENCEFF_SP_MAX ] = {
	// GYM
	{ ENCOUNT_SPTR_KUROGANE_GYM,	SEQ_GS_VS_GYMREADER },	// クロガネジム
	{ ENCOUNT_SPTR_HAKUTAI_GYM,		SEQ_GS_VS_GYMREADER },	// ハクタイジム
	{ ENCOUNT_SPTR_NOMOSE_GYM,		SEQ_GS_VS_GYMREADER },	// ノモセジム
	{ ENCOUNT_SPTR_TOBARI_GYM,		SEQ_GS_VS_GYMREADER },	// トバリジム
	{ ENCOUNT_SPTR_YOSUGA_GYM,		SEQ_GS_VS_GYMREADER },	// ヨスガトジム
	{ ENCOUNT_SPTR_KISSAKI_GYM,		SEQ_GS_VS_GYMREADER },	// キッサキジム
	{ ENCOUNT_SPTR_MIO_GYM,			SEQ_GS_VS_GYMREADER },	// ミオジム
	{ ENCOUNT_SPTR_NAGISA_GYM,		SEQ_GS_VS_GYMREADER },	// ナギサジム
	// GYM カントー
	{ ENCOUNT_SPTR_TAKESHI,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_KASUMI,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_MATHISU,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_ERIKA,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_ANZU,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_NATSUME,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_KATSURA,	SEQ_GS_VS_GYMREADER_KANTO },
	{ ENCOUNT_SPTR_GREEN,	SEQ_GS_VS_GYMREADER_KANTO },
	// 四天王
	{ ENCOUNT_SPTR_SITEN_00,	SEQ_GS_VS_GYMREADER },
	{ ENCOUNT_SPTR_SITEN_01,	SEQ_GS_VS_GYMREADER },
	{ ENCOUNT_SPTR_SITEN_02,	SEQ_GS_VS_GYMREADER },
	{ ENCOUNT_SPTR_SITEN_03,	SEQ_GS_VS_GYMREADER },
	// チャンピオン
	{ ENCOUNT_SPTR_CHANPION,	SEQ_GS_VS_CHAMP },
	// ライバル
	{ ENCOUNT_SPTR_RIVAL,		SEQ_GS_VS_RIVAL },
	// 特殊ポケモン
#ifdef POKEGS_ENC	//	現在はロケット団のエフェクトを入れて判別できているか分かるようにします。
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_GS_VS_RAIKOU  },	// ライコウ
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_GS_VS_ENTEI   },	// エンテイ
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_GS_VS_SUICUNE },	// スイクン
	{ ENCOUNT_LEGEND_HOUOU,		SEQ_GS_VS_HOUOU   },	// ホウオウ
	{ ENCOUNT_LEGEND_RUGIA,		SEQ_GS_VS_LUGIA   },	// ルギア
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_GS_VS_KODAI },		// グラードン、カイオーガ、レックウザ
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_GS_VS_NORAPOKE_KANTO },	// ミュウツー、ラティアス、ラティオス
//	{ ENCOUNT_LEGEND_NORMAL,	SEQ_GS_VS_NORAPOKE },	// セレビィ(戦闘ないはず 一之瀬さんより)
//	{ ENCOUNT_LEGEND_NORMAL,	SEQ_GS_VS_NORAPOKE },	// ダミー
#else
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_BA_DPOKE1 },	// シェイミ
	{ ENCOUNT_LEGEND_PACKAGE,	SEQ_BA_DPOKE1 },	// イア、エア
	{ ENCOUNT_LEGEND_PACKAGE,	SEQ_BA_DPOKE1 },	// レイ　ハイ
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_BA_DPOKE1 },	// アイ
	{ ENCOUNT_LEGEND_PACKAGE,	SEQ_BA_DPOKE1 },	// アルセウス
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_BA_DPOKE1 },	// レジギガス、ヒードラン、
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_BA_DPOKE1 },	// クレセリア
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_BA_DPOKE1 },	// ファイアー、サンダー、フリーザー
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_BA_DPOKE1 },	// キマイラン
	{ ENCOUNT_LEGEND_NORMAL,	SEQ_BA_DPOKE1 },	// レジスチル、レジアイス、レジロック
#endif
	// ロケット団
	// GSで変更&追加 09.02.25 add by hosaka genya
	{ ENCOUNT_ROCKET_NORMAL,	SEQ_GS_VS_ROCKET },	// 通常メンバー
//	{ ENCOUNT_ROCKET_SPECIAL,	SEQ_GS_VS_ROCKET},	// 幹部クラス
//	{ ENCOUNT_ROCKET_SPECIAL,	SEQ_GS_VS_ROCKET},	// ボス（現在はダミー）
	{ ENCOUNT_ROCKET_RAMUDA,	SEQ_GS_VS_ROCKET },	// 準幹部：ラムダ
	{ ENCOUNT_ROCKET_LANCE,		SEQ_GS_VS_ROCKET },	// 準幹部：ランス
	{ ENCOUNT_ROCKET_APORO,		SEQ_GS_VS_ROCKET },	// 幹部：アポロ
	{ ENCOUNT_ROCKET_ATENA,		SEQ_GS_VS_ROCKET },	// 幹部：アテナ
	{ ENCOUNT_ROCKET_SAKAKI,	SEQ_GS_VS_ROCKET },	// ボス：サカキ

	// その他特殊バトル
	{ ENCOUNT_SPECIAL_TOWER,	SEQ_GS_VS_TRAINER },	// バトルタワー
	{ ENCOUNT_SPECIAL_TOWER,	SEQ_GS_VS_TRAINER },	// 通信バトル
	{ ENCOUNT_SPECIAL_DOUBLE,	SEQ_GS_VS_TRAINER  },	// ダブルバトル
	{ ENCOUNT_SPECIAL_DOUBLE,	SEQ_GS_VS_NORAPOKE },	// ダブルバトルやせい
//	{ ENCOUNT_SPECIAL_TOWER,	SEQ_BA_CHANP },	// バトルタワータイクーンを
	{ ENCOUNT_SPECIAL_TOWER,	SEQ_GS_BA_BRAIN },	// フロンティアブレーン（タワータイクーンを変更）
	{ ENCOUNT_SPECIAL_DOUBLE,	SEQ_GS_VS_GYMREADER },	// ダブルバトルジム

	// ノーマル
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_GS_VS_TRAINER },	// トレーナー
	{ ENCOUNT_EFFECT_SEARCH,	SEQ_GS_VS_NORAPOKE/*SEQ_BA_POKE*/ },	// 野生

	//---------------------------------------------
	// 以下、GSで追加 09.02.25 add by hosaka genya

	{ ENCOUNT_SHOJI,			SEQ_GS_VS_TRAINER },	// まいこはん
	{ ENCOUNT_OLD,				SEQ_GS_VS_CHAMP },	// レッド

//	{ エフェクト,BGM },
};


//-----------------------------------------------------------------------------
/**
 *					プロトタイプ宣言
*/
//-----------------------------------------------------------------------------
static u32 FLD_EncEffSpDataTypeGetTrainer( u32 tr_type );
static u32 FLD_EncEffSpDataTypeGetPokemon( POKEPARTY* p_poke_party, int zoneid );

static u32 FLD_EncEffSpDataTypeGet( const BATTLE_PARAM* p_bp );
static u32 FLD_EncEffSpDataEffectNoGet( u32 type, const BATTLE_PARAM* p_bp );
static u32 FLD_EncEffSpDataBgmNoGet( u32 type, const BATTLE_PARAM* p_bp );




//----------------------------------------------------------------------------
/**
 *	@brief	特殊エンカウントタイプ　取得
 *
 *	@param	BATTLE_PARAM* p_bp
 *	@retval	特殊エンカウントテーブル
 *	@retval	FLD_ENCEFF_SP_MAX	特殊テーブルにない
 *
 *	* 優先順位
 *		特殊トレーナー
 *		特殊ポケモンは　バトルタワー　通信　ダブルでは
 *		出てこないと考えて作成
 */
//-----------------------------------------------------------------------------
static u32 FLD_EncEffSpDataTypeGet( const BATTLE_PARAM* p_bp )
{
	u32 fight_type = p_bp->fight_type;
	u32 trainer_sp;
	u32 mons_sp = SEQ_GS_VS_NORAPOKE;


	// トレーナー戦チェック
	if( (fight_type & FIGHT_TYPE_TRAINER) ){

		// トレーナーチェック
		trainer_sp = FLD_EncEffSpDataTypeGetTrainer( p_bp->trainer_data[ CLIENT_NO_ENEMY ].tr_type );

		// バトルタワーは、特殊トレーナーIDなので
		// 先に判断する
		if( fight_type & FIGHT_TYPE_TOWER ){

			// フロンティアブレインを最優先
			if( trainer_sp == FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN ){
				return trainer_sp;
			}

			// ダブルバトルチェック
			if( fight_type & FIGHT_TYPE_2vs2 ){
				return FLD_ENCEFF_SP_BATTLE_DOUBLE;
			}
			return FLD_ENCEFF_SP_BATTLE_TOWER;
		}

		// ロケット団を優先する
		if( (trainer_sp >= FLD_ENCEFF_SP_ROCKET_NORMAL) &&
			(trainer_sp <= FLD_ENCEFF_SP_ROCKET_SAKAKI) ){
			return trainer_sp;
		}

		// まいこはんを優先する @ GS追加
		if( (trainer_sp == FLD_ENCEFF_SP_MAIKO ) )
		{
			return trainer_sp;
		}

		// レッドを優先する @ GS追加
		if( (trainer_sp == FLD_ENCEFF_SP_RED ) )
		{
			return trainer_sp;
		}

		// ダブルバトルチェック
		if( fight_type & FIGHT_TYPE_2vs2 ){

#if 0	// ダブルバトルジムがあったらここを書き換えればよい
			if( trainer_sp == FLD_ENCEFF_SP_GYM_NAGISA ){
				return FLD_ENCEFF_SP_BATTLE_DOUBLE_GYM;
			}
#endif
			return FLD_ENCEFF_SP_BATTLE_DOUBLE;
		}

		// 通信バトルチェック
		if( fight_type & FIGHT_TYPE_SIO ){
			return FLD_ENCEFF_SP_BATTLE_COMMU;
		}

		return trainer_sp;
	}

	// 特殊ポケモンチェック
	mons_sp = FLD_EncEffSpDataTypeGetPokemon( p_bp->poke_party[ CLIENT_NO_ENEMY ], p_bp->zone_id );

	// フィールド以下の特殊ポケモンなら返す
	if( mons_sp < FLD_ENCEFF_SP_NORMAL_FIELD ){
		return mons_sp;
	}

	// ダブルバトルチェック
	if( fight_type & FIGHT_TYPE_2vs2 ){
		return FLD_ENCEFF_SP_BATTLE_DOUBLE_YASEI;
	}

	// 野生
	return mons_sp;
}


//----------------------------------------------------------------------------
/**
 *	@brief	エンカウントエフェクトナンバーの取得
 *	@param	type	【特殊エンカウントタイプ定数】
 *	@param	p_bp	バトルパラメータ
 *	@return	エンカウントエフェクトナンバー
 */
//-----------------------------------------------------------------------------
static u32 FLD_EncEffSpDataEffectNoGet( u32 type, const BATTLE_PARAM* p_bp )
{
	GF_ASSERT( type < FLD_ENCEFF_SP_MAX );

	if( FLD_EncEffSpData[ type ].effect_no == ENCOUNT_EFFECT_SEARCH ){
		// >レベル差などを見て決める
		// GSでは時間帯になりました。09.02.25 add by hosaka genya
		return ENCEFF_GetEffectNo( p_bp );
	}else{

		return FLD_EncEffSpData[ type ].effect_no;
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	BGMナンバーの取得
 *	@param	type	【特殊エンカウントタイプ定数】
 *	@param	p_bp	バトルパラメータ
 *	@return	BGMナンバー
 */
//-----------------------------------------------------------------------------
static u32 FLD_EncEffSpDataBgmNoGet( u32 type, const BATTLE_PARAM* p_bp )
{
	GF_ASSERT( type < FLD_ENCEFF_SP_MAX );
	return FLD_EncEffSpData[ type ].bgm_no;
}

//----------------------------------------------------------------------------
/**
 *	[type の取得は内部で行う]
 *	@brief	エンカウントエフェクトナンバーの取得
 *	@param	p_bp	バトルパラメータ
 *	@return	エンカウントエフェクトナンバー
 */
//-----------------------------------------------------------------------------
u32 FLD_EncEffSpDataEffectNoPackGet( const BATTLE_PARAM* p_bp )
{
	u32 type;
	type = FLD_EncEffSpDataTypeGet( p_bp );
	return FLD_EncEffSpDataEffectNoGet( type, p_bp );
}

//----------------------------------------------------------------------------------
/**
 * トレーナータイプは四天王か
 *
 * @param   type	トレーナータイプ
 *
 * @retval  BOOL	TRUE:四天王	FALSE:違う
 */
//----------------------------------------------------------------------------------
static BOOL _big4_check( u32 type )
{
	// 四天王か
	if( ENCOUNT_SPTR_SITEN_00 ||
        ENCOUNT_SPTR_SITEN_01 ||
        ENCOUNT_SPTR_SITEN_02 ||
        ENCOUNT_SPTR_SITEN_03 ){
		return TRUE;
	}

	return FALSE;
}

//----------------------------------------------------------------------------
/**
 *	[type の取得は内部で行う]
 *	@brief	BGMナンバーの取得
 *	@param	p_bp	バトルパラメータ
 *	@return	BGMナンバー
 */
//-----------------------------------------------------------------------------
u32 FLD_EncEffSpDataBgmNoPackGet( const BATTLE_PARAM* p_bp )
{
	u32 type;
	BOOL b_arrive_flag = TRUE;
	int bgm_no;

	type = FLD_EncEffSpDataTypeGet( p_bp );
	bgm_no = FLD_EncEffSpDataBgmNoGet( type, p_bp );

#ifdef ENCOUNT_BGM_CHECK_ARRIVE_T06
	// カントー上陸フラグを取得
	b_arrive_flag = SysFlag_ArriveGet( SaveData_GetEventWork( p_bp->savedata ), FLAG_ARRIVE_T06 );
#endif

	// カントーBGM切替 09.03.23 add by hosaka genya
	// ゲームクリア後、カントーエリアだったら
	if( b_arrive_flag == 1 && ZoneData_IsKanto( p_bp->zone_id ) ) {
		if( bgm_no == SEQ_GS_VS_NORAPOKE )	{ bgm_no = SEQ_GS_VS_NORAPOKE_KANTO; } else
		if( bgm_no == SEQ_GS_VS_TRAINER )	{ bgm_no = SEQ_GS_VS_TRAINER_KANTO; } else
		if( bgm_no == SEQ_GS_VS_GYMREADER )	{

			// 四天王じゃなければジョウト・カントーのジムリーダー曲を入れ替える
			if(_big4_check(type)==FALSE){
				bgm_no = SEQ_GS_VS_GYMREADER_KANTO;
			}
		}
	}

	return bgm_no;
}

//-----------------------------------------------------------------------------
/**
 *			プライベート関数
 */
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------
/**
 *	@brief	エンカウントエフェクトデータ取得
 *
 *	@param	p_data		データ格納先
 *	@param	type		【特殊エンカウントタイプ定数】
 */
//-----------------------------------------------------------------------------
static void FLD_EncEffSpDataGet( FLD_ENCEFF_SP_DATA* p_data, u32 type )
{
	// タイプが不正
	GF_ASSERT( type < FLD_ENCEFF_SP_MAX );
	*p_data = FLD_EncEffSpData[ type ];
}


//----------------------------------------------------------------------------
/**
 *	@brief	特殊トレーナーからエンカウントタイプ選出
 *
 *	@param	tr_type	トレーナーTYPE
 *
 *	@retval	特殊エンカウントテーブル
 *	@retval	FLD_ENCEFF_SP_MAX	特殊テーブルにない
 */
//-----------------------------------------------------------------------------
typedef struct _ENCEFF_SPDATA_TBL{
	u16	type:10;	//0-1023
	u16	eff_no:6;	//0-63
}ENCEFF_SPDATA_TBL;

static const ENCEFF_SPDATA_TBL DATA_SpDataTrainer[] = {
 {	TRTYPE_LEADER1,		FLD_ENCEFF_SP_GYM_KUROGANE	},
 {	TRTYPE_LEADER2,		FLD_ENCEFF_SP_GYM_HAKUTAI	},
 {	TRTYPE_LEADER3,		FLD_ENCEFF_SP_GYM_NOMOSE	},
 {	TRTYPE_LEADER4,		FLD_ENCEFF_SP_GYM_TOBARI	},
 {	TRTYPE_LEADER5,		FLD_ENCEFF_SP_GYM_YOSUGA	},
 {	TRTYPE_LEADER6,		FLD_ENCEFF_SP_GYM_KISSAKI	},
 {	TRTYPE_LEADER7,		FLD_ENCEFF_SP_GYM_MIO	},
 {	TRTYPE_LEADER8,		FLD_ENCEFF_SP_GYM_NAGISA	},
 {	TRTYPE_LEADER9,		FLD_ENCEFF_SP_GYM_TAKESHI	},
 {	TRTYPE_LEADER10,	FLD_ENCEFF_SP_GYM_KASUMI	},
 {	TRTYPE_LEADER11,	FLD_ENCEFF_SP_GYM_MATHISU	},
 {	TRTYPE_LEADER12,	FLD_ENCEFF_SP_GYM_ERIKA	},
 {	TRTYPE_LEADER13,	FLD_ENCEFF_SP_GYM_ANZU	},
 {	TRTYPE_LEADER14,	FLD_ENCEFF_SP_GYM_NATSUME	},
 {	TRTYPE_LEADER15,	FLD_ENCEFF_SP_GYM_KATSURA	},
 {	TRTYPE_OLDRIVAL,	FLD_ENCEFF_SP_GYM_GREEN	},
 {	TRTYPE_BIGFOUR1,	FLD_ENCEFF_SP_BIGFOUR_00	},
 {	TRTYPE_BIGFOUR2,	FLD_ENCEFF_SP_BIGFOUR_01	},
 {	TRTYPE_BIGFOUR3,	FLD_ENCEFF_SP_BIGFOUR_02	},
 {	TRTYPE_BIGFOUR4,	FLD_ENCEFF_SP_BIGFOUR_03	},
 {	TRTYPE_CHAMPION,	FLD_ENCEFF_SP_CHANPION	},
 {	TRTYPE_RIVAL,		FLD_ENCEFF_SP_RIVAL	},
 {	TRTYPE_FIRSTRIVAL,	FLD_ENCEFF_SP_RIVAL	},
 {	TRTYPE_RLEADER01,	FLD_ENCEFF_SP_ROCKET_APORO	},
 {	TRTYPE_RLEADER02,	FLD_ENCEFF_SP_ROCKET_ATENA	},
 {	TRTYPE_RLEADER03,	FLD_ENCEFF_SP_ROCKET_LANCE	},
 {	TRTYPE_RLEADER04,	FLD_ENCEFF_SP_ROCKET_RAMUDA	},
 {	TRTYPE_RBOSS,		FLD_ENCEFF_SP_ROCKET_SAKAKI	},
 {	TRTYPE_ROCKETM,		FLD_ENCEFF_SP_ROCKET_NORMAL	},
 {	TRTYPE_ROCKETW,		FLD_ENCEFF_SP_ROCKET_NORMAL	},
 {	TRTYPE_MAIKO,		FLD_ENCEFF_SP_MAIKO	},
 {	TRTYPE_OLDHERO,		FLD_ENCEFF_SP_RED	},
 /*	まだトレーナータイプがない
 {	TRTYPE_PL_KUROTUGU,	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN	},
 {	TRTYPE_PL_FBOSS1,	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN	},
 {	TRTYPE_PL_FBOSS2,	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN	},
 {	TRTYPE_PL_FBOSS3,	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN	},
 {	TRTYPE_PL_FBOSS4,	FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN	},
 */
};

static const ENCEFF_SPDATA_TBL DATA_SpDataMons[] = {
 {	MONSNO_RAIKOU,		FLD_ENCEFF_SP_LEGEND_MOVE_RAIKOU },	 //	ライコウ
 {  MONSNO_ENTEI,		FLD_ENCEFF_SP_LEGEND_MOVE_ENTEI	},	 //	エンテイ
 {  MONSNO_SUIKUN,		FLD_ENCEFF_SP_LEGEND_MOVE_SUIKUN },	 //	スイクン
 {  MONSNO_RUGIA,		FLD_ENCEFF_SP_PACKAGE_RUGIA	},	 //	ルギア
 {  MONSNO_HOUOU,		FLD_ENCEFF_SP_PACKAGE_HOUOU	},	 //	ホウオウ
 {  MONSNO_GURAADON,	FLD_ENCEFF_SP_LEGEND_KODAI	},	 //	グラードン
 {  MONSNO_KAIOOGA,		FLD_ENCEFF_SP_LEGEND_KODAI	},	 //	カイオーガ
 {  MONSNO_REKKUUZA,	FLD_ENCEFF_SP_LEGEND_KODAI	},	 //	レックウザ
 {  MONSNO_MYUUTUU,		FLD_ENCEFF_SP_LEGEND_NORA	},	 //	ミュウツー
 {  MONSNO_RATHIOSU,	FLD_ENCEFF_SP_LEGEND_NORA	},	 //	ラティオス
 {  MONSNO_RATHIASU,	FLD_ENCEFF_SP_LEGEND_NORA	},	 //	ラティアス
};

static u32 FLD_EncEffSpDataTypeGetTrainer( u32 tr_type )
{
	int i;

	for(i = 0;i < NELEMS(DATA_SpDataTrainer);i++){
		if(DATA_SpDataTrainer[i].type == tr_type){
			return DATA_SpDataTrainer[i].eff_no;
		}
	}
	return FLD_ENCEFF_SP_NORMAL_TRAINER;
#if 0

	// tr_typeがきちんと連番で並んでいないので
	// 全部caseでとる必要がある
	switch( tr_type ){
	// GYM
	case TRTYPE_LEADER1:		// クロガネジム
		retval = FLD_ENCEFF_SP_GYM_KUROGANE;
		break;
	case TRTYPE_LEADER2:		// ハクタイジム
		retval = FLD_ENCEFF_SP_GYM_HAKUTAI;
		break;
	case TRTYPE_LEADER3:		// ノモセジム
		retval = FLD_ENCEFF_SP_GYM_NOMOSE;
		break;
	case TRTYPE_LEADER4:		// トバリジム
		retval = FLD_ENCEFF_SP_GYM_TOBARI;
		break;
	case TRTYPE_LEADER5:		// ヨスガトジム
		retval = FLD_ENCEFF_SP_GYM_YOSUGA;
		break;
	case TRTYPE_LEADER6:		// キッサキジム
		retval = FLD_ENCEFF_SP_GYM_KISSAKI;
		break;
	case TRTYPE_LEADER7:		// ミオジム
		retval = FLD_ENCEFF_SP_GYM_MIO;
		break;
	case TRTYPE_LEADER8:		// ナギサジム
		retval = FLD_ENCEFF_SP_GYM_NAGISA;
		break;
	// GYM カントー
	case TRTYPE_LEADER9:
		retval = FLD_ENCEFF_SP_GYM_TAKESHI;
		break;
	case TRTYPE_LEADER10:
		retval = FLD_ENCEFF_SP_GYM_KASUMI;
		break;
	case TRTYPE_LEADER11:
		retval = FLD_ENCEFF_SP_GYM_MATHISU;
		break;
	case TRTYPE_LEADER12:
		retval = FLD_ENCEFF_SP_GYM_ERIKA;
		break;
	case TRTYPE_LEADER13:
		retval = FLD_ENCEFF_SP_GYM_ANZU;
		break;
	case TRTYPE_LEADER14:
		retval = FLD_ENCEFF_SP_GYM_NATSUME;
		break;
	case TRTYPE_LEADER15:
		retval = FLD_ENCEFF_SP_GYM_KATSURA;
		break;
	case TRTYPE_OLDRIVAL:
		retval = FLD_ENCEFF_SP_GYM_GREEN;
		break;
	// 四天王
	case TRTYPE_BIGFOUR1:
		retval = FLD_ENCEFF_SP_BIGFOUR_00;
		break;
	case TRTYPE_BIGFOUR2:
		retval = FLD_ENCEFF_SP_BIGFOUR_01;
		break;
	case TRTYPE_BIGFOUR3:
		retval = FLD_ENCEFF_SP_BIGFOUR_02;
		break;
	case TRTYPE_BIGFOUR4:
		retval = FLD_ENCEFF_SP_BIGFOUR_03;
		break;

	// チャンピオン
	case TRTYPE_CHAMPION:
		retval = FLD_ENCEFF_SP_CHANPION;
		break;

	// ライバル(はじめてのライバルも）
	case TRTYPE_RIVAL:
	case TRTYPE_FIRSTRIVAL:
		retval = FLD_ENCEFF_SP_RIVAL;
		break;

	// ロケット団へ変更
	// 09.03.17 add by hosaka genya
	case TRTYPE_RLEADER01:
		retval = FLD_ENCEFF_SP_ROCKET_APORO;
		break;
	case TRTYPE_RLEADER02:
		retval = FLD_ENCEFF_SP_ROCKET_ATENA;
		break;
	case TRTYPE_RLEADER03:
		retval = FLD_ENCEFF_SP_ROCKET_RAMUDA;
		break;
	case TRTYPE_RLEADER04:
		retval = FLD_ENCEFF_SP_ROCKET_LANCE;
		break;
	case TRTYPE_RBOSS:
		retval = FLD_ENCEFF_SP_ROCKET_SAKAKI;
		break;
		// したっぱ
	case TRTYPE_ROCKETM:
	case TRTYPE_ROCKETW:
		retval = FLD_ENCEFF_SP_ROCKET_NORMAL;
		break;

	// まいこはん 09.02.25 add by hosaka genya
	case TRTYPE_MAIKO:
		retval = FLD_ENCEFF_SP_MAIKO;
		break;

	// レッド 09.03.18 add by hosaka genya
	case TRTYPE_OLDHERO:
		retval = FLD_ENCEFF_SP_RED;
		break;

	// フロンティアブレイン
/*	case TRTYPE_KUROTUGU:
	case TRTYPE_FBOSS1:		//	まだトレーナータイプがない
	case TRTYPE_FBOSS2:
	case TRTYPE_FBOSS3:
	case TRTYPE_FBOSS4:
		retval = FLD_ENCEFF_SP_BATTLE_FRONTIER_BRAIN;
		break;
*/	default:
		break;
	}

	return retval;
#endif
}

//----------------------------------------------------------------------------
/**
 *	@brief	特殊ポケモン　チェック
 *
 *	@param	p_poke_party	ポケモンパーティ
 *	@param	zoneid			ゾーンID
 *
 *	@retval	特殊エンカウントテーブル
 *	@retval	FLD_ENCEFF_SP_MAX	特殊テーブルにない
 */
//-----------------------------------------------------------------------------
static u32 FLD_EncEffSpDataTypeGetPokemon( POKEPARTY* p_poke_party, int zoneid )
{
	int i,monsno;

	// ポケモンパラメータ取得
	monsno = PokeParaGet(EvPoke_GetLivingPokemonTop( p_poke_party ), ID_PARA_monsno, NULL );

	if( zoneid == FLD_ENCEFF_PALPARK_ZONEID ){
		return FLD_ENCEFF_SP_NORMAL_FIELD;
	}
	for(i = 0;i < NELEMS(DATA_SpDataMons);i++){
		if(DATA_SpDataMons[i].type == monsno){
			return DATA_SpDataMons[i].eff_no;
		}
	}
	return FLD_ENCEFF_SP_NORMAL_FIELD;
#if 0
	switch( monsno ){
	case MONSNO_RAIKOU:		//	ライコウ
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_LEGEND_MOVE_RAIKOU;
		}
		break;

	case MONSNO_ENTEI:		//	エンテイ
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_LEGEND_MOVE_ENTEI;
		}
		break;

	case MONSNO_SUIKUN:		//	スイクン
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_LEGEND_MOVE_SUIKUN;
		}
		break;

	case MONSNO_RUGIA:		//	ルギア
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_PACKAGE_RUGIA;
		}
		break;

	case MONSNO_HOUOU:		//	ホウオウ
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_PACKAGE_HOUOU;
		}
		break;

//	case MONSNO_SEREBHI:	//	セレビィ
	case MONSNO_GURAADON:	//	グラードン
	case MONSNO_KAIOOGA:	//	カイオーガ
	case MONSNO_REKKUUZA:	//	レックウザ
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_LEGEND_KODAI;
		}
		break;

	case MONSNO_MYUUTUU:	//	ミュウツー
	case MONSNO_RATHIOSU:	//	ラティオス
	case MONSNO_RATHIASU:	//	ラティアス
		if( zoneid != FLD_ENCEFF_PALPARK_ZONEID ){
			retval = FLD_ENCEFF_SP_LEGEND_NORA;
		}
		break;
	default:
		break;
	}
	return retval;
#endif
}